using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using ENT.GP.Core.Core;
using System.Data;

namespace ENT.GP.Core.Proyecto
{
    [Serializable]
    public class ProyectosSupervisiones :
      BusinessListBase<ProyectosSupervisiones, ProyectoSupervision>
    {
        #region Factory Methods

        internal static ProyectosSupervisiones NewProyectosSupervisiones()
        {
            return DataPortal.CreateChild<ProyectosSupervisiones>();
        }

        internal static ProyectosSupervisiones GetProyectosSupervisiones(int IdP)
        {
            return DataPortal.FetchChild<ProyectosSupervisiones>(IdP);
        }

        private ProyectosSupervisiones()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(int IdP)
        {
            RaiseListChangedEvents = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", IdP);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Obtener_Proyecto_Supervision").Tables[0].Rows)
            {
                this.Add(ProyectoSupervision.GetProyectoSupervision(items));
            }

            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoSupervision : BusinessBase<ProyectoSupervision>
    {
        #region Business Methods

        private static PropertyInfo<int> IdProperty = RegisterProperty<int>(o => o.Id, "Name");
        public int Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<int> IdProyectoProperty = RegisterProperty<int>(o => o.IdProyecto, "Name");
        public int IdProyecto
        {
            get { return GetProperty(IdProyectoProperty); }
            set { SetProperty(IdProyectoProperty, value); }
        }

        private static PropertyInfo<string> ActividadProperty = RegisterProperty<string>(o => o.Actividad, "Name");
        public string Actividad
        {
            get { return GetProperty(ActividadProperty); }
            set { SetProperty(ActividadProperty, value); }
        }

        private static PropertyInfo<int> ActividadIdProperty = RegisterProperty<int>(o => o.ActividadId, "Name");
        public int ActividadId
        {
            get { return GetProperty(ActividadIdProperty); }
            set { SetProperty(ActividadIdProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        private static PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(o => o.Descripcion, "Name");
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { SetProperty(DescripcionProperty, value); }
        }

        private static PropertyInfo<int> TipoRecursoProperty = RegisterProperty<int>(o => o.TipoRecurso, "Name");
        public int TipoRecurso
        {
            get { return GetProperty(TipoRecursoProperty); }
            set { SetProperty(TipoRecursoProperty, value); }
        }

        private static PropertyInfo<Documentos> DocumentosSupervisionProperty = RegisterProperty<Documentos>(o => o.DocumentosSupervision);
        /// <summary>
        /// Obtiene o Establece la Lista de Documentos asociados al perfil del proyecto
        /// </summary>
        public Documentos DocumentosSupervision
        {
            get
            {
                if (!(FieldManager.FieldExists(DocumentosSupervisionProperty)))
                    if (this.IsNew)
                        LoadProperty(DocumentosSupervisionProperty, Documentos.NewDocuementos());
                    else
                        LoadProperty(DocumentosSupervisionProperty, Documentos.GetDocuementos(ReadProperty(IdProyectoProperty), 5, ReadProperty(IdProperty)));
                return GetProperty(DocumentosSupervisionProperty);
            }
        }
        
        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        protected override void AddAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowWrite("Name", "Role");
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowEdit(typeof(ProyectoSupervision), "Role");
        }

        #endregion

        #region Factory Methods

        public static ProyectoSupervision NewProyectoSupervision()
        {
            return DataPortal.CreateChild<ProyectoSupervision>();
        }

        internal static ProyectoSupervision GetProyectoSupervision(DataRow childData)
        {
            return DataPortal.FetchChild<ProyectoSupervision>(childData);
        }

        public static ProyectoSupervision GetProyectoSupervision(int id)
        {
            return DataPortal.FetchChild<ProyectoSupervision>(id);
        }

        public ProyectoSupervision()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(int id)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDS", id);
            DataRow childData = objhm.EjecutarStoreProcedure(parametros, "Obtener_Supervision").Tables[0].Rows[0];

            LoadProperty(IdProperty, Convert.ToInt32(childData[0].ToString()));
            LoadProperty(IdProyectoProperty, Convert.ToInt32(childData[1].ToString()));
            LoadProperty(ActividadProperty, childData[8].ToString());
            LoadProperty(TipoRecursoProperty, childData[3].ToString());
            LoadProperty(DescripcionProperty, childData[4].ToString());
            LoadProperty(FechaProperty, Convert.ToDateTime(childData[5].ToString()));
            LoadProperty(ActividadIdProperty, Convert.ToInt32(childData[2].ToString()));
            
        }

        private void Child_Fetch(DataRow childData)
        {
            LoadProperty(IdProperty, Convert.ToInt32(childData[0].ToString()));
            LoadProperty(IdProyectoProperty, Convert.ToInt32(childData[1].ToString()));
            LoadProperty(ActividadProperty, childData[8].ToString());
            LoadProperty(TipoRecursoProperty, childData[3].ToString());            
            LoadProperty(DescripcionProperty, childData[4].ToString());
            LoadProperty(FechaProperty,Convert.ToDateTime( childData[5].ToString()));
            LoadProperty(ActividadIdProperty, Convert.ToInt32(childData[2].ToString()));
        }

        private void Child_Insert(int IdP)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[5];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDPROYECTO", IdP );
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDCAT_ACTIVIDAD",ActividadId );
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("IDCAT_TIPO_RECURSO",TipoRecurso);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("DESCRIPCION", Descripcion);
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("FECHA", Fecha);

                var idInfSup = Convert.ToInt32(objhm.EjecutarStoreProcedure("Insertar_Supervision", parametros,1));
                Id = idInfSup;
                FieldManager.UpdateChildren(IdP,Id);
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
        }

        private void Child_Update(int IdS)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[4];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDCAT_ACTIVIDAD", Actividad);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDCAT_TIPO_RECURSO", TipoRecurso);
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("DESCRIPCION", Descripcion);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("IDSUPERVISION", IdS);

                objhm.EjecutarStoreProcedure("Insertar_Supervision", parametros);

            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
        }

        private void Child_DeleteSelf(object parent)
        {
            // TODO: delete values
        }

        #endregion
    }
}
